home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1997
/
MacHack 1997.toast
/
Hacks
/
Hacks ’93
/
Inside Mac Movie Toolbox Code
/
mtb11.c
< prev
next >
Wrap
Text File
|
1992-10-22
|
5KB
|
166 lines
// Copyright: © 1992 by Apple Computer, Inc., all rights reserved.
#include "mtb.h"
/* for the following constants, please consult the Macintosh
Audio Compression and Expansion Toolkit, specifically pages
38 and 39 */
#define kMACEBeginningNumberOfBytes 6
#define kMACE31MonoPacketSize 2
#define kMACE31StereoPacketSize 4
#define kMACE61MonoPacketSize 1
#define kMACE61StereoPacketSize 2
void CreateSoundDescription (Handle sndHandle,
SoundDescriptionHandle sndDesc,
long *sndDataOffset,
long *numSamples,
long *sndDataSize )
{
long sndHdrOffset = 0;
long sampleDataOffset;
SoundHeaderPtr sndHdrPtr = nil;
long numFrames;
long samplesPerFrame;
long bytesPerFrame;
SignedByte sndHState;
SoundDescriptionPtr sndDescPtr;
*sndDataOffset = 0;
*numSamples = 0;
*sndDataSize = 0;
SetHandleSize( (Handle)sndDesc, sizeof(SoundDescription) );
CheckError(MemError(),"\pSetHandleSize");
sndHdrOffset = GetSndHdrOffset (sndHandle);
if (sndHdrOffset == 0) CheckError(-1, "\pGetSndHdrOffset ");
// we can use pointers since we don't move memory
sndHdrPtr = (SoundHeaderPtr) (*sndHandle + sndHdrOffset);
sndDescPtr = *sndDesc;
sndDescPtr->descSize = sizeof (SoundDescription);
// total size of sound description structure
sndDescPtr->resvd1 = 0;
sndDescPtr->resvd2 = 0;
sndDescPtr->dataRefIndex = 1;
sndDescPtr->compressionID = 0;
sndDescPtr->packetSize = 0;
sndDescPtr->version = 0;
sndDescPtr->revlevel = 0;
sndDescPtr->vendor = 0;
switch (sndHdrPtr->encode) {
case stdSH:
sndDescPtr->dataFormat = 'raw ';
// uncompressed offset-binary data
sndDescPtr->numChannels = 1;
// number of channels of sound
sndDescPtr->sampleSize = 8;
// number of bits per sample
sndDescPtr->sampleRate = sndHdrPtr->sampleRate;
// sample rate
*numSamples = sndHdrPtr->length;
*sndDataSize = *numSamples;
bytesPerFrame = 1;
samplesPerFrame = 1;
sampleDataOffset = (Ptr)&sndHdrPtr->sampleArea
- (Ptr)sndHdrPtr;
break;
case extSH:
{
ExtSoundHeaderPtr extSndHdrP;
extSndHdrP = (ExtSoundHeaderPtr)sndHdrPtr;
sndDescPtr->dataFormat = 'raw ';
// uncompressed offset-binary data
sndDescPtr->numChannels = extSndHdrP->numChannels;
// number of channels of sound
sndDescPtr->sampleSize = extSndHdrP->sampleSize;
// number of bits per sample
sndDescPtr->sampleRate = extSndHdrP->sampleRate;
// sample rate
numFrames = extSndHdrP->numFrames;
*numSamples = numFrames;
bytesPerFrame = extSndHdrP->numChannels *
( extSndHdrP->sampleSize / 8);
samplesPerFrame = 1;
*sndDataSize = numFrames * bytesPerFrame;
sampleDataOffset = (Ptr)(&extSndHdrP->sampleArea)
- (Ptr)extSndHdrP;
}
break;
case cmpSH:
{
CmpSoundHeaderPtr cmpSndHdrP;
cmpSndHdrP = (CmpSoundHeaderPtr)sndHdrPtr;
sndDescPtr->numChannels = cmpSndHdrP->numChannels;
// number of channels of sound
sndDescPtr->sampleSize = cmpSndHdrP->sampleSize;
// number of bits per sample before compression
sndDescPtr->sampleRate = cmpSndHdrP->sampleRate;
// sample rate
numFrames = cmpSndHdrP->numFrames;
sampleDataOffset =(Ptr)(&cmpSndHdrP->sampleArea)
- (Ptr)cmpSndHdrP;
switch (cmpSndHdrP->compressionID) {
case threeToOne:
sndDescPtr->dataFormat = 'MAC3';
// compressed 3:1 data
samplesPerFrame = kMACEBeginningNumberOfBytes;
*numSamples = numFrames * samplesPerFrame;
switch (cmpSndHdrP->numChannels) {
case 1:
bytesPerFrame = cmpSndHdrP->numChannels
* kMACE31MonoPacketSize;
break;
case 2:
bytesPerFrame = cmpSndHdrP->numChannels
* kMACE31StereoPacketSize;
break;
default:
CheckError(-1, "\pCorrupt sound data" );
break;
}
*sndDataSize = numFrames * bytesPerFrame;
break;
case sixToOne:
sndDescPtr->dataFormat = 'MAC6';
// compressed 6:1 data
samplesPerFrame = kMACEBeginningNumberOfBytes;
*numSamples = numFrames * samplesPerFrame;
switch (cmpSndHdrP->numChannels) {
case 1:
bytesPerFrame = cmpSndHdrP->numChannels
* kMACE61MonoPacketSize;
break;
case 2:
bytesPerFrame = cmpSndHdrP->numChannels
* kMACE61StereoPacketSize;
break;
default:
CheckError(-1, "\pCorrupt sound data" );
break;
}
*sndDataSize = (*numSamples) * bytesPerFrame;
break;
default:
CheckError(-1, "\pCorrupt sound data" );
break;
}
} // switch cmpSndHdrP->compressionID:*/
break; // of cmpSH:
default:
CheckError(-1, "\pCorrupt sound data" );
break;
} // switch sndHdrPtr->encode*/
*sndDataOffset = sndHdrOffset + sampleDataOffset;
}